﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class OrganizacaoPrestadorServicoProduto
    {
        #region Variaveis Membros
        private int _idPrestadorServicoProduto;
        private Organizacao _organizacaoPrestador;
        private FornecedorServicoProduto _fornecedorServicoProduto;
        private Status _status;
        private Contrato _contrato;
        private TipoPeriodicidade _tipoPeriodicidade;
        private string _dataVencimento;
        private string _dia;
        private string _tipoDia;
        private string _antecipaPagamento;
        private TipoFormaPagamento _tipoFormaPagamento;
        private List<OrganizacaoPrestadorServicoProdutoData> _dataServicoProduto;
        private GENTEEntities _context;
        #endregion
        
        #region Parametros
        public int IdPrestadorServicoProduto
        {
            get { return _idPrestadorServicoProduto; }
            set { _idPrestadorServicoProduto = value; }
        }
        public Organizacao OrganizacaoPrestador
        {
            get { return _organizacaoPrestador; }
            set { _organizacaoPrestador = value; }
        }
        public FornecedorServicoProduto FornecedorServicoProduto
        {
            get { return _fornecedorServicoProduto; }
            set { _fornecedorServicoProduto = value; }
        }
        public Status Status
        {
            get { return _status; }
            set { _status = value; }
        }
        public Contrato Contrato
        {
            get { return _contrato; }
            set { _contrato = value; }
        }
        public TipoPeriodicidade TipoPeriodicidade
        {
            get { return _tipoPeriodicidade; }
            set { _tipoPeriodicidade = value; }
        }
        public string DataVencimento
        {
            get { return _dataVencimento; }
            set { _dataVencimento = value; }
        }
        public string Dia
        {
            get { return _dia; }
            set { _dia = value; }
        }
        public string TipoDia
        {
            get { return _tipoDia; }
            set { _tipoDia = value; }
        }
        public string AntecipaPagamento
        {
            get { return _antecipaPagamento; }
            set { _antecipaPagamento = value; }
        }
        public TipoFormaPagamento TipoFormaPagamento
        {
            get { return _tipoFormaPagamento; }
            set { _tipoFormaPagamento = value; }
        }
        public List<OrganizacaoPrestadorServicoProdutoData> DataServicoProduto
        {
            get { return _dataServicoProduto; }
            set { _dataServicoProduto = value; }
        }
        #endregion

        #region Construtores
        public OrganizacaoPrestadorServicoProduto()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public OrganizacaoPrestadorServicoProduto(int idPrestadorServicoProduto)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idPrestadorServicoProduto);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados

        #region Métodos de Seleção
        private void Carregar(int idPrestadorServicoProduto)
        {
            try
            {
                var consulta = from opsp in _context.tab_relacao_prestador_tipo_servico_produto
                               where opsp.id_relacao_fornecedor_prestador == idPrestadorServicoProduto
                               select new
                               {
                                   opsp.id_relacao_fornecedor_prestador,
                                   id_organ_prestador = opsp.tab_organizacao.Id_organizacao,
                                   id_fornecedor_servico = opsp.tab_relacao_fornecedor_tipo_servico_produto.id_fornecedor_servico,
                                   id_status_servico = opsp.tab_status.id_status,
                                   id_contrato = opsp.tab_contrato.Id_contrato,
                                   id_tipo_periodicidade = opsp.tab_tipo_periodicidade.id_tipo_periodicidade,
                                   //opsp.dt_vencimento,
                                   opsp.tipo_dia,
                                   id_tipo_forma_pagamento = opsp.tab_tipo_forma_pagamento.id_tipo_forma_pagamento
                               };

                var listTipoServico = consulta.ToList();

                foreach (var list in listTipoServico)
                {
                    this._idPrestadorServicoProduto = list.id_relacao_fornecedor_prestador;
                    this._organizacaoPrestador = new Organizacao(list.id_organ_prestador);
                    this._fornecedorServicoProduto = new FornecedorServicoProduto(list.id_fornecedor_servico);
                    this._status = new Status(list.id_status_servico);
                    this._contrato = new Contrato(list.id_contrato);
                    this._tipoPeriodicidade = new TipoPeriodicidade(list.id_tipo_periodicidade);
                    //this._dataVencimento = list.dt_vencimento;
                    this._tipoDia = list.tipo_dia;
                    this._tipoFormaPagamento = new TipoFormaPagamento(list.id_tipo_forma_pagamento);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion

        #region Metodos Publicos

        #region Métodos de Seleção
        public List<OrganizacaoPrestadorServicoProduto> SelectAll()
        {
            try
            {
                List<OrganizacaoPrestadorServicoProduto> listOrganizacaoPrestadorServicoProduto = new List<OrganizacaoPrestadorServicoProduto>();

                var consulta = from opsp in _context.tab_relacao_prestador_tipo_servico_produto
                               select new
                               {
                                   opsp.id_relacao_fornecedor_prestador,
                                   id_organ_prestador = opsp.tab_organizacao.Id_organizacao,
                                   id_fornecedor_servico = opsp.tab_relacao_fornecedor_tipo_servico_produto.id_fornecedor_servico,
                                   id_status_servico = opsp.tab_status.id_status,
                                   id_contrato = opsp.tab_contrato.Id_contrato,
                                   id_tipo_periodicidade = opsp.tab_tipo_periodicidade.id_tipo_periodicidade,
                                   //opsp.dt_vencimento,
                                   opsp.tipo_dia,
                                   id_tipo_forma_pagamento = opsp.tab_tipo_forma_pagamento.id_tipo_forma_pagamento
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoPrestadorServicoProduto organizacaoPrestadorServicoProduto = new OrganizacaoPrestadorServicoProduto();
                    organizacaoPrestadorServicoProduto.IdPrestadorServicoProduto = list.id_relacao_fornecedor_prestador;
                    organizacaoPrestadorServicoProduto.OrganizacaoPrestador = new Organizacao(list.id_organ_prestador);
                    organizacaoPrestadorServicoProduto.FornecedorServicoProduto = new FornecedorServicoProduto(list.id_fornecedor_servico);
                    organizacaoPrestadorServicoProduto.Status = new Status(list.id_status_servico);
                    organizacaoPrestadorServicoProduto.Contrato = new Contrato(list.id_contrato);
                    organizacaoPrestadorServicoProduto.TipoPeriodicidade = new TipoPeriodicidade(list.id_tipo_periodicidade);
                    //organizacaoPrestadorServicoProduto.DataVencimento = list.dt_vencimento;
                    organizacaoPrestadorServicoProduto.TipoDia = list.tipo_dia;
                    organizacaoPrestadorServicoProduto.TipoFormaPagamento = new TipoFormaPagamento(list.id_tipo_forma_pagamento);

                    listOrganizacaoPrestadorServicoProduto.Add(organizacaoPrestadorServicoProduto);
                }
                return listOrganizacaoPrestadorServicoProduto;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<OrganizacaoPrestadorServicoProduto> SelectFornecedor(int idOrganizacao, string razaoSocial, int idCategoriaServicoProduto)
        {
            try
            {
                List<OrganizacaoPrestadorServicoProduto> listOrganizacaoPrestadorServicoProduto = new List<OrganizacaoPrestadorServicoProduto>();

                var consulta = (from opsp in _context.tab_relacao_prestador_tipo_servico_produto
                                join ofsp in _context.tab_relacao_fornecedor_tipo_servico_produto on opsp.tab_relacao_fornecedor_tipo_servico_produto.id_fornecedor_servico equals ofsp.id_fornecedor_servico
                                where (opsp.tab_organizacao.Id_organizacao == idOrganizacao)
                                && ((razaoSocial != string.Empty) ? (ofsp.tab_organizacao.razao_social.Contains(razaoSocial)) : (1 == 1))
                                && (opsp.tab_status.id_status == 1)
                                && (ofsp.tab_tipo_servico_produto.tab_categoria_servico_produto.Id_categoria_servico_produto == idCategoriaServicoProduto)
                                select new
                                {
                                    opsp.tab_relacao_fornecedor_tipo_servico_produto.id_fornecedor_servico
                                }).Distinct();

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoPrestadorServicoProduto organizacaoPrestadorServicoProduto = new OrganizacaoPrestadorServicoProduto();
                    organizacaoPrestadorServicoProduto.FornecedorServicoProduto = new FornecedorServicoProduto(list.id_fornecedor_servico);

                    listOrganizacaoPrestadorServicoProduto.Add(organizacaoPrestadorServicoProduto);
                }

                return listOrganizacaoPrestadorServicoProduto;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void CarregarDataServicoProduto(int idOrganizacao, int idLocalidade, int idFornecedor)
        {
            try
            {
                var consulta = (from opsp in _context.tab_relacao_prestador_tipo_servico_produto
                                where opsp.tab_organizacao.Id_organizacao == idOrganizacao
                                && opsp.tab_cidade.id_cidade == idLocalidade
                                && opsp.tab_relacao_fornecedor_tipo_servico_produto.id_fornecedor_servico == idFornecedor
                                select new
                                {
                                    opsp.id_relacao_fornecedor_prestador
                                });

                var listConsulta = consulta.ToList();

                if (listConsulta.Count == 0)
                {
                    string msgDataServico = "";
                    msgDataServico += "Não foi encontrado nenhuma parametrização de data de entrega de protocolo deste benefício no cadastro deste prestador.";
                    msgDataServico += " Será necessário que, primeiro acesse o cadastro do prestador e informe as datas de entrega de protocolo deste benefício (tipo de serviço).";
                    msgDataServico += " Após efetuar essa parametrização, retorne a esta página e efetue o upload do documento novamente!";
                    
                    throw new Exception(msgDataServico);
                }

                foreach (var list in listConsulta)
                {
                    OrganizacaoPrestadorServicoProdutoData dataServicoProduto = new OrganizacaoPrestadorServicoProdutoData();
                    this._dataServicoProduto = dataServicoProduto.SelectPor(list.id_relacao_fornecedor_prestador);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public int RetornaIdPrestadorServicoProduto(int idPrestador, int idLocalidade, int idFornecedorServico)
        {
            try
            {
                int resultado = 0;

                var consulta = (from opsp in _context.tab_relacao_prestador_tipo_servico_produto
                                where opsp.tab_organizacao.Id_organizacao == idPrestador
                                && opsp.tab_cidade.id_cidade == idLocalidade
                                && opsp.tab_relacao_fornecedor_tipo_servico_produto.id_fornecedor_servico == idFornecedorServico
                                select new
                                {
                                    opsp.id_relacao_fornecedor_prestador
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    resultado = list.id_relacao_fornecedor_prestador;
                }

                return resultado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
